﻿// 701 最小边权差生成树.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <memory.h>


using namespace std;


/*
http://oj.daimayuan.top/course/14/problem/693

给你一张 n个顶点 m条边的无向简单连通图，顶点编号从 1到 n
，每条边都有一个边权，边权为非负整数。

请求出这张图的所有生成树中，边权最大的边的边权与边权最小的边的边权的差值最小是多少。

输入格式
第一行两个整数 n,m，表示图的顶点数、边数。

接下来 m行，每行三个整数 x,y,z
，表示 x号点与 y号点之间有一条边权为 z的边。

数据保证图中顶点两两连通。

输出格式
输出一行一个数表示生成树的最小边权差。

样例输入
4 4
1 2 1
2 3 4
3 4 5
1 4 6
样例输出
2
数据规模
对于所有数据，保证 2≤n≤5000,n−1≤m≤8000,1≤x,y≤n,1≤z≤10000。
*/


//无单调性 不能二分

struct Node {
	int x, y, v;
	bool operator < (const Node& A)const {
		return v < A.v;
	}
}a[10001];

int n, m, fa[10001];

int findset(int i) {
	if (i == fa[i])
		return i;
	return fa[i] = findset(fa[i]);
}



int main()
{
	scanf("%d%d",&n,&m);
	for (int i = 1; i <= m; i++)
		scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v);
	sort(a+1,a+m+1);
	int ans = 1 << 30;
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= 10000; j++) {
			fa[j] = j;
		}
		int cnt = n;
		for (int j = i; j <= m; j++) {
			int x = findset(a[j].x); int y = findset(a[j].y);
			if (x != y) {
				fa[x] = y;
				--cnt;
			}
			if (cnt == 1) {
				ans = min(ans, a[j].v - a[i].v);
				break;
			}
		}
	}
	printf("%d\n",ans);
	return 0;
}
 